package com.gsj.lx.mybatislx.config;

import com.gsj.lx.mybatislx.model.MyUser;
import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import java.lang.reflect.Field;
/**
 * @program: swaggerToWrodlx
 * @description:
 * @author: 郭书江
 * @create: 2022-05-26 10:40
 **/
public class SqlUtils {
    /**
     拼接sql的方法
     */
    public static <T>  String selectseek(T entity) throws Exception{
        List<String> list = new LinkedList<>();
        //创建拼接对象
        StringBuilder sbd = new StringBuilder();
        sbd.append("select ");
        //获取当前传入的对象的类
        Class<?> aClass = entity.getClass();
        String s = String.valueOf(aClass);
        //获取当前类名
        String className = MyStringUtil.getObj(s);
        //再将类名转化为DB下的表名
        String classNameTODBName = MyStringUtil.classNameReverseToDBName(className);
        //获取当前传入的类的属性值
        Field[] declaredFields = entity.getClass().getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            //获取当前类的特点属性的名字
            String fieldName = declaredFields[i].getName();
            //对fieldName进行转化为数据库的_命名规范
            String dbName = MyStringUtil.fieldNameReverseToDBName(fieldName);
            //调用get方法获取对象的fieldName的值
            String field = MyStringUtil.getMethodByName(entity.getClass(), entity, fieldName);
            //对getFieldByMethod进行判断，如果是int属性，未赋值就是0，char[]或者text就是null或者""
            if (!(field.equals("null") || field.equals(" ") || field.equals("0"))) {
                //存入list中作为查询条件
                list.add(dbName + "= '" + field + "'");
            }
            if (i != declaredFields.length - 1) {
                sbd.append(dbName + " " + fieldName + ", ");
            } else {
                sbd.append(dbName + " " + fieldName + " ");
            }
        }
        sbd.append(" from `" + classNameTODBName + "` ");
        if(list.size() == 0){
            //如果没有条件。就直接返回全部
            return sbd.toString();
        }
        sbd.append("where ");
        //把list中的数据提取出来进行拼接
        for (int i = 0; i < list.size(); i++) {
            if (i != list.size() - 1) {
                sbd.append(list.get(i) + " and ");
            } else {
                sbd.append(list.get(i));
            }
        }
        return sbd.toString();
    }

    /**
     * 拼接sql插入
     * @param entity
     * @param <T>
     * @return
     * @throws Exception
     */
    public static  <T> String insert(T entity)throws Exception{
        StringBuilder val = new StringBuilder();
        //创建拼接对象
        StringBuilder sbd = new StringBuilder();
        sbd.append("insert into ");
        //获取当前传入的对象的类
        Class<?> aClass = entity.getClass();
        String s = String.valueOf(aClass);
        //获取当前类名
        String className = MyStringUtil.getObj(s);
        //再将类名转化为DB下的表名
        String classNameTODBName = MyStringUtil.classNameReverseToDBName(className);
//获取当前传入的类的属性值
        Field[] declaredFields = entity.getClass().getDeclaredFields();
        sbd.append(classNameTODBName+" (");
        for (int i = 0; i < declaredFields.length; i++) {
            //获取当前类的特点属性的名字
            String fieldName = declaredFields[i].getName();
            //对fieldName进行转化为数据库的_命名规范
            String dbName = MyStringUtil.fieldNameReverseToDBName(fieldName);
            //调用get方法获取对象的fieldName的值
            String field = MyStringUtil.getMethodByName(entity.getClass(), entity, fieldName);

            if (i != declaredFields.length - 1) {
                if (!(field.equals("null") || field.equals(" ") || field.equals("0"))) {
                    sbd.append(dbName + ",");
                }
            } else {
                if (!(field.equals("null") || field.equals(" ") || field.equals("0"))) {
                    sbd.append(dbName + " )");
                }else {
                    sbd.append(" )");
                }
            }


            //对getFieldByMethod进行判断，如果是int属性，未赋值就是0，char[]或者text就是null或者""
            if (!(field.equals("null") || field.equals(" ") || field.equals("0"))) {
                //存入list中作为查询条件
//                val.append(" '" + field + "'");
                if (i != declaredFields.length - 1) {
                    val.append(" '" + field + "',");
                } else {
                    val.append(" '" + field + "')");
                }
            }

        }
        sbd.append(" values (");
        sbd.append(val);
        /*if(list.size() == 0){
            //如果没有条件。就直接返回全部
            return sbd.toString();
        }
        sbd.append(" values (`" + classNameTODBName + "` ");
        //把list中的数据提取出来进行拼接
        for (int i = 0; i < list.size(); i++) {
            if (i != list.size() - 1) {
                sbd.append(list.get(i) + " and ");
            } else {
                sbd.append(list.get(i));
            }
        }*/
        return sbd.toString();
    }
    private static String getTableName(Class clazz){
        String s = String.valueOf(clazz);
        //获取当前类名
        String className = MyStringUtil.getObj(s);
        //再将类名转化为DB下的表名
        String classNameTODBName = MyStringUtil.classNameReverseToDBName(className);
        return classNameTODBName;
    }
    /**
     * 拼接sql批量插入
     * @param list
     */
    public static String insertAll(List<MyUser> list) throws InvocationTargetException, IllegalAccessException {
        // 使用反射非常简单

            // 第一步：提供一个类
            Class clazz = list.get(0).getClass();
            //得到表名
            String tableName = SqlUtils.getTableName(clazz);


            // 只能获取public访问权限的方法
            Method[] method = clazz.getMethods();

            StringBuffer sb = new StringBuffer("INSERT INTO "+tableName+" (");
            for (int i = 0; i < method.length; i++) {
                if (method[i].getName().contains("get") && !method[i].getName().equals("getClass")) {
                    // 截取第四个以后的字符，并且变成小写
                    sb.append(method[i].getName().substring(3).toLowerCase()).append(",");
                }
            }
            // 去掉最后一个“,”,并添加后面的内容
            sb.deleteCharAt(sb.length() - 1).append(") VALUES");
            for (MyUser l : list) {
                sb.append("(");
                for (int i = 0; i < method.length; i++) {
                    if (method[i].getName().contains("get") && !method[i].getName().equals("getClass")) {
                        sb.append(method[i].invoke(l)).append(",");
                    }
                }
                // 去掉最后一个“,”,并添加后面的内容
                sb.deleteCharAt(sb.length() - 1).append("),");
            }
            sb.deleteCharAt(sb.length() - 1).append(";");

        return sb.toString();
    }


}
